package ar.frba.utn.diseñosistemas.ViewModels;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

import org.uqbar.commons.model.UserException;
import org.uqbar.commons.utils.Observable;

import scala.math.Numeric.IntIsIntegral;

import ar.frba.utn.diseñosistemas.TP2.Asiento;
import ar.frba.utn.diseñosistemas.TP2.AterrizarSingleton;
import ar.frba.utn.diseñosistemas.TP2.Busqueda;
import ar.frba.utn.diseñosistemas.TP2.Itinerario;
import ar.frba.utn.diseñosistemas.TP2.Usuario;
import ar.frba.utn.diseñosistemas.UI.ReservaUserException;

@Observable
public class BuscadorViewModel
{
	private String origen;
	private String destino;
	private String fecha;
	private List<Asiento> resultados;
	private Asiento asientoSeleccionado;
	
	public BuscadorViewModel()
	{
		this.origen = "";
		this.destino = "";
		this.fecha = "";
		this.resultados = new ArrayList<Asiento>();
		this.asientoSeleccionado = null;
	}
	
	public void setFecha(String fecha) {
		if (fecha == null || fecha.isEmpty())
			throw new UserException("La fecha es obligatoria");
		
		this.fecha = fecha;
	}
	public String getFecha() {
		return fecha;
	}

	public void setOrigen(String origen) {
		if (fecha == null || origen.isEmpty())
			throw new UserException("El origen es obligatorio");
		
		this.origen = origen;
	}
	public String getOrigen() {
		return origen;
	}

	public void setDestino(String destino) {
		if (fecha == null || destino.isEmpty())
			throw new UserException("El destino es obligatorio");
		
		this.destino = destino;
	}
	public String getDestino() {
		return destino;
	}
	
	public List<Asiento> getResultados()
	{
		return this.resultados;
	}
	public void setResultados(List<Asiento> resultados)
	{
		this.resultados = resultados;
	}
	
	public Asiento getAsientoSeleccionado()
	{
		return this.asientoSeleccionado;
	}
	public void setAsientoSeleccionado(Asiento unAsiento)
	{
		this.asientoSeleccionado = unAsiento;
	}
	
	public void buscar()
	{
		Busqueda unaBusqueda = new Busqueda(getOrigen(), getDestino(), getFecha());
		Usuario usuarioLogeado = AterrizarSingleton.getInstance().getUsuarioLogeado();
		
		List<Itinerario> itinerarios = usuarioLogeado.Buscar(unaBusqueda);
		
		List<Asiento> asientos = new ArrayList<Asiento>();
		for (Itinerario itinerario : itinerarios) {
			asientos.addAll(itinerario.getAsientos());
		}
		
		this.setResultados(asientos);
		
		if (asientos.isEmpty())
			throw new UserException("No se han encontrado asientos para los criterios seleccionados");
	}

	public void reservar()
	{
		Usuario usuarioLogeado = AterrizarSingleton.getInstance().getUsuarioLogeado();
		Asiento unAsiento = this.getAsientoSeleccionado();
		
		if (unAsiento == null)
			throw new UserException("Debe seleccionar un asiento");
		
		if (unAsiento.estaReservado())
			throw new ReservaUserException("El asiento ya se encuentra reservado.");
		
		ArrayList<Asiento> asientos = new ArrayList<Asiento>();
		asientos.add(unAsiento);
		
		usuarioLogeado.reservar(asientos);
	}
	
	public void comprar()
	{
		Usuario usuarioLogeado = AterrizarSingleton.getInstance().getUsuarioLogeado();
		Asiento unAsiento = this.getAsientoSeleccionado();
		
		if (unAsiento == null)
			throw new UserException("Debe seleccionar un asiento");
		
		usuarioLogeado.Comprar(new Itinerario().addAsiento(unAsiento));
	}

	public void sobreReservar() 
	{
		Usuario usuarioLogeado = AterrizarSingleton.getInstance().getUsuarioLogeado();
		Asiento unAsiento = this.getAsientoSeleccionado();
		
		ArrayList<Asiento> asientos = new ArrayList<Asiento>();
		asientos.add(unAsiento);
		
		usuarioLogeado.reservar(asientos);
	}
}
